//method的复杂一点的用法

//通过问题的描述，去写相应的代码实现。
package main

import (
	"fmt"
)

const (
	WHITE = iota
	BLACK
	BLUE
	RED
	YELLOW
)

type Color byte

//定义一个盒子类型，盒子有长，宽，高以及颜色 4个属性
type Box struct {
	width, height, depth float64
	color                Color
}

//定义一个类型来表示一堆盒子
type BoxList []Box

//求一个盒子的体积
func (b Box) Volume() float64 {
	return b.width * b.depth * b.height
}

//设置一个盒子的颜色（这里用到指针！！）
func (b *Box) SetColor(c Color) {
	b.color = c
	// *b.color = c 和上面一行代码的作用是一样的。
}

//求出一堆盒子里面体积最大的那个盒子的颜色
func (b1 BoxList) BigestColor() Color {
	v := 0.00
	k := Color(WHITE) // 类型转换？？
	for _, value := range b1 {
		if bv := value.Volume(); bv > v {
			v = bv
			k = value.color
		}
	}
	return k
}

//把一堆盒子全部涂成黑色
func (b1 BoxList) PainToBlack() {
	for i, _ := range b1 {
		b1[i].SetColor(BLACK)
		// &b1[i].SetColor(BLACK) 和上面一行代码的作用是一样的
	}
}

//这个暂时不理解~~~
func (c Color) String() string {
	strings := []string{"WHITE", "BLACK", "BLUE", "RED", "YELLOW"}
	return strings[c]
}

func main() {
	boxes := BoxList{
		Box{4, 4, 4, RED},
		Box{5, 6, 7, BLACK},
		Box{1, 2, 3, RED},
	}

	fmt.Println("总共", len(boxes), "个盒子")

	fmt.Println("第一个盒子的体积是：", boxes[0].Volume(), "cm3")

	fmt.Println("最后一个盒子的颜色是:", boxes[len(boxes)-1].color.String())
	fmt.Println("最大的盒子的颜色是：", boxes.BigestColor())
}
